class_name EaseUtil

## 曲线工具
## TODO 更多类型参考Unity项目
#region 属性
#endregion
#region 字段
#endregion
#region 信号
#endregion

#region 基类方法
#endregion
#region 公共方法
## 线性
static func get_linear(st,end,duration:float) -> LinearEase:
	return LinearEase.new(st,end,duration)
static func get_quadratic(st,end,duration:float) -> QuadraticEase:
	return QuadraticEase.new(st,end,duration)
#endregion
#region 私有方法
#endregion
#region 生命周期函数
#endregion
#region 自定义类
##st:起始值
##end:结束值
##duration:持续时间
##PS：
##t = 0 - 动画从0s开始
##st = 200 - 对象 x 坐标的起始位置为200
##end = 300 - 目标位置300
##duration = 1 - 对象用 1 秒时间来完成从 200 到 300 的移动
class BaseEase:
	var _st
	var _end
	var _offest
	var _duration:float
	func _init(st,end,duration:float) -> void:
		_st = st
		_end = end
		_offest = _end - _st
		_duration = duration
	func ease_in(t:float) -> float:
		return 0
	func ease_out(t:float) -> float:
		return 0
	func ease_in_out(t:float) -> float:
		return 0
class LinearEase extends BaseEase:
	func ease_in(t:float) -> float:
		return _offest * t / _duration + _st
	func ease_out(t:float) -> float:
		return _offest * t / _duration + _st
	func ease_in_out(t:float) -> float:
		return _offest * t / _duration + _st
class QuadraticEase extends BaseEase:
	func ease_in(t:float) -> float:
		t = t / _duration
		return _offest * t * t + _st;
	func ease_out(t:float) -> float:
		t = t / _duration
		return -_offest * t * (t - 2) + _st
	func ease_in_out(t:float) -> float:
		var temp = _duration / 2
		if t / temp < 1:
			return _offest / 2 * t / temp * t / temp + _st
		else:
			t = t / temp - 1
			return -_offest / 2 * (t * (t - 2) - 1) + _st
#endregion
